//给你一个下标从 0 开始的数组 nums ，数组中的元素都是 正 整数。请你选出两个下标 i 和 j（i != j），且 nums[i] 的数位和 与 
//nums[j] 的数位和相等。 
//
// 请你找出所有满足条件的下标 i 和 j ，找出并返回 nums[i] + nums[j] 可以得到的 最大值 。 
//
// 
//
// 示例 1： 
//
// 
//输入：nums = [18,43,36,13,7]
//输出：54
//解释：满足条件的数对 (i, j) 为：
//- (0, 2) ，两个数字的数位和都是 9 ，相加得到 18 + 36 = 54 。
//- (1, 4) ，两个数字的数位和都是 7 ，相加得到 43 + 7 = 50 。
//所以可以获得的最大和是 54 。 
//
// 示例 2： 
//
// 
//输入：nums = [10,12,19,14]
//输出：-1
//解释：不存在满足条件的数对，返回 -1 。
// 
//
// 
//
// 提示： 
//
// 
// 1 <= nums.length <= 10⁵ 
// 1 <= nums[i] <= 10⁹ 
// 
//
// Related Topics 数组 哈希表 排序 堆（优先队列） 👍 69 👎 0


package LeetCode.editor.cn;

import java.util.*;

/**
 * @author ldltd
 * @date 2023-11-18 22:41:40
 * @description 2342.数位和相等数对的最大和
 */
public class MaxSumOfAPairWithEqualSumOfDigits{
	 public static void main(String[] args) {
	 	 //测试代码
	 	 Solution solution = new MaxSumOfAPairWithEqualSumOfDigits().new Solution();
		solution.maximumSum(new int[]{18,43,36,13,7});
	 }
	 
//力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public int maximumSum1(int[] nums) {
		Map<Integer, PriorityQueue<Integer>> map=new HashMap<>();
		for (int num : nums) {
			int t=0,a=num;
			while (a!=0){
				t+=a%10;
				a/=10;
			}
			if(map.containsKey(t)){
				PriorityQueue<Integer> list = map.get(t);
				list.add(num);
				map.put(t,list);
			}else {
				PriorityQueue<Integer>q=new PriorityQueue<>(Collections.reverseOrder());
				q.offer(num);
				map.put(t,q);
			}
		}
		int res=-1;
		for (Map.Entry<Integer, PriorityQueue<Integer>> integerPriorityQueueEntry : map.entrySet()) {
			int t=0;
			PriorityQueue<Integer> q = integerPriorityQueueEntry.getValue();
			if(q.size()>=2){
				t+=q.poll();
				t+=q.poll();
				res=Math.max(res,t);
			}
		}
		return  res;
    }

	public int maximumSum(int[] nums) {
			int res=-1;
			int [] ar=new int[82];//最多9个9相加
		for (int num : nums) {
			//数位和
			int t=0;
			for (int i = num; i > 0; i/=10) {
				t+=i%10;
			}
			//如果左边已经有一个数位和等于t的数
			if(ar[t]>0){
				res=Math.max(res,ar[t]+num);
			}
			//这里的ar只存储最大的一个数，
			ar[t]=Math.max(ar[t],num);
		}
		return res;
	}
}
//leetcode submit region end(Prohibit modification and deletion)

}
